# -*- coding: utf-8 -*-

from google.appengine.ext import db
import math
import operator

class Persona(db.Model):
    nome = db.StringProperty()
    idade = db.IntegerProperty()
    sexo = db.StringProperty(choices=set(["Masculino","Feminino"]))
    descricao = db.StringProperty()
    imagem = db.BlobProperty()
    mecanicas = db.ListProperty(db.Key)
    
    # Diferenciais sem�nticos devem ser inteiros de 1 a 10
    acaoReflexao = db.IntegerProperty()
    monoPolicromatico = db.IntegerProperty()
    coletivoIndividual = db.IntegerProperty()
    
    # Se a persona est� trancada para edi��o
    trancado = db.BooleanProperty(default=False)
    
    qtdModificacoes = db.IntegerProperty()
        
    def getSimilares(self, excluded_pids):
        """
        Retorna uma lista de dicion�rios diocion�rios[persona,semelhanca] ordenados pelo grau de
        similaridade com esta persona
        """
        
        personas = Persona.all()
        
        similares = [];
        for p in personas:
            if p.key() != self.key():
                if p.acaoReflexao and p.monoPolicromatico and p.coletivoIndividual:
                    # Calcula a semelhanca de com todas as personas cadastradas
                    r1 = math.fabs(p.acaoReflexao - self.acaoReflexao)
                    r2 = math.fabs(p.monoPolicromatico - self.monoPolicromatico)
                    r3 = math.fabs(p.coletivoIndividual - self.coletivoIndividual)
                    r = (r1 + r2 + r3)/3
                    rt = ((9-r)/9)*100
                    if(p.key().id() not in excluded_pids):
                        similares.append(dict(persona=p, semelhanca=rt))
        
        # Ordena pela semelhanca
        similares.sort(key=operator.itemgetter('semelhanca'), reverse=True)
        
        return similares
        